// 引入express模块
const express = require('express')
// 引入sha1模块
const sha1 = require('sha1')

// 创建app应用对象
const app = express();

//验证服务器的有效性
/*
1.微信服务器识别开发着服务器,
    微信测试号管理页面   
    -用测试号中填写的url开发者服务器地址进行测试
        -使用小米求ngork实现本地内网穿透：
        http://wuyu.ngrok2.xiaomiqiu.cn
        https://wuyu.ngrok2.xiaomiqiu.cn
    -填写token:
    wuyu(自定义)
2.开发者服务器 - 验证消息是否从微信服务器传来
    目的：用过计算得出signature微信加密签名和微信服务器发来的signature进行对比，判断是否一致，一致表示消息来自微信服务器，否则，表示不是来自微信服务器。
    实现步骤：
     1.将参与微信加密签名的三个参数（timestamp，noces,token）按照字典排序在一起形成一个数组；
     2.将形成的数组中的所有参数拼接在一起形成一个字符串，进行sha1加密；
     3.将加密完成的signature和微信发送过来的进行对比：
        一致，表示消息来自微信服务器，
        否则，表示不是来自微信服务器
*/

// 定义配置对象
const config = {
    token:'wuyu',
    // 测试号：
    // appId:'wx304d2651cb005cac',
    // appsecret:'79a98ad297feb6ad0d2b40d44fc3b3c4',
    // 个人订阅号：
    appId:'wx37f012d93d43882f',
    appsecret:'557ae1ff4dc623577e25d1519cca45b2',
    
}



// 接受处理所有消息
app.use((req, res, next) => {
    // 微信服务器发来的参数
    // console.log(req.query)
    /*{
        signature: '6cd0859504c3dcbab6bc5752e8b45cc3a137533b', // 微信的加密签名
        echostr: '7523796442737996953', // 微信发的随机字符串
        timestamp: '1623117841', // 微信发的时间戳
        nonce: '2076503949' // 微信发送的随机数字
    }
    */

    // 对象的结构赋值
    const {signature,echostr,timestamp,nonce} = req.query;
    const {token} = config;

    // 1.将参与微信加密签名的三个参数（timestamp，noces,token）按照字典排序在一起形成一个数组；
    const arr = [timestamp,nonce,token]
    const arrSort = arr.sort();
    console.log(arrSort);

    //2.将形成的数组中的所有参数拼接在一起形成一个字符串，进行sha1加密；
    const str = arrSort.join('');
    console.log(str);
    const sha1str = sha1(str);
    console.log(sha1str)

    //3.将加密完成的signature和微信发送过来的进行对比：
   if(sha1str == signature){
       res.send(echostr);
   }else{
       res.end('靓仔，你在白嫖')
   }
})

const port = 9999;

// 监听端口号
app.listen(port, () => console.log('服务器启动成功---------' + port));